use std::collections::HashMap;
use std::sync::Mutex;
use lazy_static::lazy_static;

fn times_two(n: u32) -> u32 { n * 2 }

// 使用 lazy_static!宏声明的元素需要实现 Sync 特征。
// 这意味着如果某个静态值可变，那么必须使用诸如 Mutex 或 RwLock 这样的多线程类型，而不是 RefCell。
lazy_static! {
    static ref ITEMS: Mutex<Vec<u64>> = {
        let mut v = vec![];
        v.push(9);
        v.push(2);
        v.push(1);
        Mutex::new(v)
    };

    static ref HASHMAP: HashMap<u32, &'static str> = {
        let mut m = HashMap::new();
        m.insert(0, "foo");
        m.insert(1, "bar");
        m.insert(2, "baz");
        m
    };
    static ref COUNT: usize = HASHMAP.len();
    static ref NUMBER: u32 = times_two(21);
}

fn main() {
    println!("{:?}", ITEMS.lock());

    println!("The map has {} entries.", *COUNT);
    println!("The entry for `0` is \"{}\".", HASHMAP.get(&0).unwrap());
    println!("A expensive calculation on a static results in: {}.", *NUMBER);
}